package ar.com.tallerdos.smartdinner.business;

import java.util.ArrayList;
import java.util.List;

import ar.com.tallerdos.smartdinner.dao.ComidaDao;
import ar.com.tallerdos.smartdinner.model.Comida;
import ar.com.tallerdos.smartdinner.model.Mesa;
import ar.com.tallerdos.smartdinner.model.Mesa.MesaEstado;
import ar.com.tallerdos.smartdinner.model.Pedido;

public class ComidaBusiness {

    private static ComidaDao dao;

    public static Comida findById(Integer id) {
	return getDao().findById(id);
    }

    public static List<Comida> findAll() {
	return getDao().findAll();
    }

    public static void create(Comida entity) {
	getDao().create(entity);
    }

    public static Boolean delete(Comida entity) {
	return delete(entity.getId());
    }

    public static Boolean delete(Integer id) {
	Comida comida = findById(id);
	// for (Pedido p : comida.getPedidos()) {
	// PedidoBusiness.delete(p);
	// }
	for (Mesa mesa : comida.getMesas()) {
	    mesa.setEstado(MesaEstado.abierta);
	    MesaBusiness.update(mesa);
	}
	return getDao().delete(id);
    }

    public static Boolean update(Comida entity) {
	return getDao().update(entity);
    }

    public static Boolean createOrUpdate(Comida comida) {
	for (Pedido p : comida.getPedidos()) {
	    p.setComida(comida);
	}

	Boolean value = getDao().createOrUpdate(comida);
	for (Pedido p : comida.getPedidos()) {
	    PedidoBusiness.createOrUpdate(p);
	}
	for (Mesa m : comida.getMesas()) {
	    if (MesaBusiness.findById(m.getId()) == null) {
		MesaBusiness.create(m);
	    }
	}
	return value;
    }

    public static List<Comida> findComidasCerradasSinFacturar() {
	List<Comida> comidas = new ArrayList<Comida>();
	for (Comida comida : findAll()) {
	    if (comida.getCerrado() && !comida.getFacturado()) {
		comidas.add(comida);
	    }
	}

	return comidas;
    }

    public static ComidaDao getDao() {
	if (dao == null) {
	    dao = new ComidaDao();
	}
	return dao;
    }

    public static void setDao(ComidaDao dao) {
	ComidaBusiness.dao = dao;
    }

    public static Comida findByCodigo(Integer codigo) {
	if (codigo != null) {
	    for (Comida comida : findAll()) {
		if (codigo.equals(comida.getCodigo())) {
		    return comida;
		}
	    }
	}

	return null;
    }

}
